#include <linux/module.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/of_device.h>
#include <linux/kprobes.h>
#include <asm/traps.h>
#include <linux/kernel.h>
#include <linux/times.h>
#include <linux/delay.h>

struct timer_list timer;

/* 定时器回调函数 */
void function(unsigned long arg)
{
	static int count = 0;

	printk("%s: count = %d\n", __func__, count++);

	/* 如果需要定时器周期性运行的话就使用mod_timer函数重新设置超时值并且启动定时器 */
	//mod_timer相当于 del_timer(timer); timer->expires = expires; add_timer(timer);
	mod_timer(&timer, jiffies + msecs_to_jiffies(2000)); 
}

static int __init driver_test_init(void)
{
	int ret = 0;

	printk("[swj]: %s\n", __func__);
	init_timer(&timer); /* 初始化定时器 */

	timer.function = function;						  /* 设置定时处理函数     */
	timer.expires = jiffies + msecs_to_jiffies(5000); /* 超时时间2秒 */

	add_timer(&timer);

	mdelay(3000);

	ret = mod_timer(&timer, jiffies + msecs_to_jiffies(10000));

	printk("%s: mod_timer(), ret = %d\n", __func__, ret);

	return 0;
}

static void __exit driver_test_exit(void)
{
	printk("[swj]: %s\n", __func__);

	del_timer(&timer); /* 删除定时器 */
}

module_init(driver_test_init);
module_exit(driver_test_exit);
MODULE_LICENSE("Dual BSD/GPL");
